library(OmicCircos)Workshop MOD: Visualisation de données omiques avec R
Introduction
Données
Les données qu’on utilisera dans ce Workshop se trouvent dans la librairie OmicCircos de R. Elles se basent sur des bases de données fournies par The Cancer Genome Atlas Program (TCGA). On s’intéresse aux données des patients diagnostiqués d’un cancer du sein. Voici la liste des tableaux utilisés :
TCGA.BC.cnv.2k.60 : Les variables dans ce tableau sont respectivement le chromosome, sa position et le nom du gène observé et les 60 autres variables représentent 60 individus différents.
TCGA.BC.fus : Ce tableau représente la fusion des deux gènes qui a eu place pour un individu préci.
TCGA.BC.gene.exp.2k.60 : Sur 60 individus, on étudie une métrique en rapport avec l’expression du gène. Le chromosome, sa position et le nom du gène observé sont notés.
TCGA.BC.sample60 : On indique ici pour 60 cas quel type de cancer du sein le patient en souffre : LumA, LumB, Basal ou Her2.
TCGA.BC_Her2_cnv_exp : Dans ce tableau, des tests statistiques sont effectués et on récupère la t-value et la p-value. On note les métriques FDR et Bonferroni de plus.
TCGA.PAM50_genefu_hg18 : Il s’agit alors d’un ensemble de 50 gènes qui ont été identifiés comme une signature d’expression génique associée aux sous-types du cancer du sein (LumA, LumB, Basal, Her2 ou Normal) en fonction des schémas d’expression génique.
Recueillir les données
Afin de pouvoir mettre en oeuvre les différentes méthodes de visualisation, il nous faut tout d’abord recueillir les données et les travailler.
Pour cela, suivez les étapes présentées ci-dessous :
- Etape 1 : Chargement de la librairie “Omiccircos”
- Etape 2 : Importation des données
data("TCGA.PAM50_genefu_hg18")
data("TCGA.BC.fus")
data("TCGA.BC.cnv.2k.60")
data("TCGA.BC.gene.exp.2k.60")
data("TCGA.BC.sample60")
data("TCGA.BC_Her2_cnv_exp")- Etape 3 : Mise en forme des données
Her2.i = which(TCGA.BC.sample60[,2] == "Her2")
Her2.n = TCGA.BC.sample60[Her2.i,1]
Her2.j = which(colnames(TCGA.BC.cnv.2k.60)%in%Her2.n)
cnv = TCGA.BC.cnv.2k.60[,c(1:3,Her2.j)]
cnv.m = cnv[,c(4:ncol(cnv))]
cnv.m[cnv.m > 2] = 2
cnv.m[cnv.m < -2] = -2
cnv = cbind(cnv[,1:3], cnv.m)
Her2.j = which(colnames(TCGA.BC.gene.exp.2k.60)%in% Her2.n)
gene.exp = TCGA.BC.gene.exp.2k.60[,c(1:3,Her2.j)]Visualisations classiques
L’ensemble des visualisations ci-dessous s’appuient sur la base de données TCGA.PAM50_genefu_hg18.
Comparaison de Deux Densités
Commençons par étudier quelques densités des types de cancer. Voici un exemple très basique de visualisation graphique de la comparaison des densités des types de cancer LumA et LumB :
# création de la base de données
data <- data.frame(value = c(TCGA.PAM50_genefu_hg18$LumA,
TCGA.PAM50_genefu_hg18$LumB),
type = c(rep("LumA", 50),
rep("LumB", 50)))
# création du graphe
comparaison <- data %>%
ggplot(aes(x=value, fill=type)) +
geom_density()
# affichage du graphe
print(comparaison)L’utilisation de ggplot nécessite la création d’une base de données contenant les variables utiles pour le graphe.
Cet opérateur est un pipe, fréquemment représenté par une barre verticale ‘|’ : il renvoie la sortie d’une commande vers l’entrée d’une autre.
De nombreuses options de ggplot peuvent améliorer l’apparence générale de ce graphe telles que ci-dessous.
# création du graphe
comparaison <- data %>%
ggplot(aes(x=value, fill=type)) +
geom_density(aes(color=type), alpha=0.4) +
scale_color_manual(values = c("darkblue", "pink")) +
scale_fill_manual(values = c("darkblue", "pink")) +
theme(strip.text.x = element_text(size = 8),
plot.title = element_text(hjust = 0.5, face="bold")) +
xlab("Value") +
ylab("Density") +
guides(color = "none") +
labs(title = "Density Comparaison of Cancer Types Gene Occurrence",
fill = "Cancer Type")
# affichage du graphe
print(comparaison)Il est également possible de représenter les densités sur deux graphes différents plutôt que de les superposer.
# création du graphe
comparaison <- data %>%
ggplot(aes(x=value, fill=type)) +
geom_density(aes(color=type), alpha=0.4) +
scale_color_manual(values = c("darkblue", "pink")) +
scale_fill_manual(values = c("darkblue", "pink")) +
theme(strip.text.x = element_text(size = 8),
plot.title = element_text(hjust = 0.5, face="bold")) +
xlab("Value") +
ylab("Density") +
facet_wrap(~type, scales = "fixed")+
guides(color = "none") +
labs(title = "Density Comparaison of Cancer Types Gene Occurrence",
fill = "Cancer Type")
# affichage du graphe
print(comparaison)Les échelles des différents graphiques peuvent être formatées différemment à l’aide de l’option scales : “fixed” permet d’obtenir des échelles égales pour tous les graphes mais d’autres options telles que “free_x”, “free_y” ou “free” sont envisageables.
Le cancer de type Her2 est le type de cancer le plus courant parmi tous ceux présents dans la base de données support.
En vous appuyant sur l’exemple précédent, représentez graphiquement la comparaison des densités d’une personne atteinte d’un cancer de type Her2 et d’une personne saine.
Les données d’une personne saine sont contenues dans la variable Normal de la base de données.
Par la suite, les couleurs utilisées pour la représentation de Her2 et Normal seront respectivement darkred et darksalmon.
Afficher la Solution
# création de la base de données
data <- data.frame(value = c(TCGA.PAM50_genefu_hg18$Her2,
TCGA.PAM50_genefu_hg18$Normal),
type = c(rep("Her2", 50),
rep("Normal", 50)))
# création du graphe
comparaison <- data %>%
ggplot(aes(x=value, fill=type)) +
geom_density(aes(color=type), alpha=0.4) +
scale_color_manual(values = c("darkred", "darksalmon")) +
scale_fill_manual(values = c("darkred", "darksalmon")) +
theme(strip.text.x = element_text(size = 8),
plot.title = element_text(hjust = 0.5, face="bold")) +
xlab("Value") +
ylab("Density") +
guides(color = "none") +
labs(title = "Density Comparaison of Cancer Types Gene Occurrence",
fill = "Cancer Type")
# affichage du graphe
print(comparaison)Comparaison de Toutes les Densités
Pour mieux visualiser les différences entre les types de cancer, représentez la comparaison de la densité de l’ensemble des types de cancer.
Il est important de préciser au graphe que la variable doit être considéré comme une densité à l’aide de la commande aes(y=after_stat(density)).
Afficher la Solution
# création de la base de données pour le graphe
data <- data.frame(type = c(rep("LumA", 50),
rep("LumB", 50),
rep("Basal", 50),
rep("Her2", 50),
rep("Normal", 50)),
subtype = rep(TCGA.PAM50_genefu_hg18$chr, each = 50),
value = c(TCGA.PAM50_genefu_hg18$LumA,
TCGA.PAM50_genefu_hg18$LumB,
TCGA.PAM50_genefu_hg18$Basal,
TCGA.PAM50_genefu_hg18$Her2,
TCGA.PAM50_genefu_hg18$Normal))
# histogramme et densité des différents types de cancer
density <- data %>%
ggplot(aes(x = value, fill = type)) +
geom_density(aes(y = after_stat(density), color=type), linewidth=0.5, alpha=0.4, fill=NA) +
scale_color_manual(values = c("#69b3a2", "darkred", "darkblue", "pink", "darksalmon")) +
scale_fill_manual(values = c("#69b3a2", "darkred", "darkblue", "pink", "darksalmon")) +
theme(strip.text.x = element_text(size = 8),
plot.title = element_text(hjust = 0.5, face="bold")) +
xlab("Value") +
ylab("Density") +
labs(title = "Density of Cancer Types", color = "Cancer Type")
# affichage du graphe
print(density)Ajoutez les histogrammes respectifs des différents types de cancer sur le graphe précédent.
Cette commande du package ggplot2 permet de créer des histogrammes sur R. De nombreuses options sont disponibles comme color, alpha (règle la transparence du remplissage), binwidth (règle la largeur des intervalles) et position = “identity”, “dodge” (règle la position des bandes).
Afficher la Solution
# histogramme et densité des différents types de cancer
density <- data %>%
ggplot(aes(x = value, fill = type)) +
geom_histogram(aes(y=after_stat(density)), color = "#e9ecef", alpha = 0.3, binwidth=0.5, position = "dodge") +
geom_density(aes(y = after_stat(density), color=type), linewidth=0.5, fill=NA) +
scale_color_manual(values = c("#69b3a2", "darkred", "darkblue", "pink", "darksalmon")) +
scale_fill_manual(values = c("#69b3a2", "darkred", "darkblue", "pink", "darksalmon")) +
theme(strip.text.x = element_text(size = 8),
plot.title = element_text(hjust = 0.5, face="bold")) +
labs(fill = "Cancer Type") +
xlab("") +
ylab("Density") +
labs(title = "Density of Cancer Type") +
guides(color = "none")
# affichage du graphe
print(density)Fréquence des Gènes sur l’Ensemble des Chromosomes
En appliquant les compétences acquises jusqu’ici, représentez la fréquence des gènes de Her2 sous forme d’histogrammes et de densités pour chacun des chromosomes.
Afficher la Solution
# création de la base de données pour le graphe
data <- data.frame(
type = TCGA.PAM50_genefu_hg18$chr,
value = TCGA.PAM50_genefu_hg18$Her2
)
# histogramme de fréquence pour chaque chromosome
frequence <- data %>%
ggplot(aes(x = value, bins=30, color = type, fill = type)) +
geom_histogram(alpha = 0.6, position = "identity") +
geom_density(aes(y=after_stat(ndensity)), alpha = 0.5, fill = "grey", color = "black", linewidth = 0.25) +
scale_fill_viridis(discrete = FALSE) +
scale_color_viridis(discrete = FALSE) +
theme(strip.text.x = element_text(size = 8),
plot.title = element_text(hjust = 0.5, face="bold")) +
xlab("Chromosome") +
ylab("Assigned Probability (%)") +
facet_wrap(~type, scales = "fixed", nrow=3)+
guides(color = "none", fill="none") +
labs(title = "Frequency of Her2 Gene Occurrence on All Chromosomes")
# affichage du graphe
print(frequence)De la même façon que le graphe précédent, représentez graphiquement la fréquence des gènes de chaque type de cancer sous forme d’histogrammes et de densités pour chacun des chromosomes.
Afficher la Solution
# création de la base de données pour le graphe
data <- data.frame(type = TCGA.PAM50_genefu_hg18$chr,
subtype = c(rep("LumA", 50),
rep("LumB", 50),
rep("Basal", 50),
rep("Her2", 50),
rep("Normal", 50)),
value = c(TCGA.PAM50_genefu_hg18$LumA,
TCGA.PAM50_genefu_hg18$LumB,
TCGA.PAM50_genefu_hg18$Basal,
TCGA.PAM50_genefu_hg18$Her2,
TCGA.PAM50_genefu_hg18$Normal))
# histogramme de fréquence pour chaque chromosome
frequence <- data %>%
ggplot(aes(x = value, fill = subtype, color=subtype)) +
geom_histogram(alpha = 0.6, position = "dodge") +
geom_density(aes(y=after_stat(ndensity), color = subtype), alpha = 0.25, fill = "grey", size = 0.25) +
scale_color_manual(values = c("#69b3a2", "darkred", "darkblue", "pink", "darksalmon")) +
scale_fill_manual(values = c("#69b3a2", "darkred", "darkblue", "pink", "darksalmon")) +
theme(strip.text.x = element_text(size = 8),
plot.title = element_text(hjust = 0.5, face="bold")) +
xlab("Chromosome") +
ylab("Frequency") +
facet_wrap(~type, scales = "fixed", nrow=3)+
guides(color = "none") +
labs(title = "Frequency of Cancer Type Gene Occurrence on Each Chromosome",
fill = "Cancer Type")
# affichage du graphe
print(frequence)Création de HEATMAP
Une heatmap (ou carte thermique) est une méthode de visualisation qui permet de représenter des données de grande dimension. C’est une représentation sous forme de grille de cellules colorées. Cette méthode peut être utilisée pour visualiser les observations, les corrélations ou des valeurs manquantes par exemple.
Création d’une heatmap intéractive
L’objectif de cette partie est de réaliser des heatmap intéractives représentant les observations. Vous pourrez connaître la valeur d’une cellule en faisant simplement glisser votre souris dessus.
Pour cette première visualisation, il vous faut charger la librairie “heatmaply” et faire un choix de gradient de couleurs à l’aide des commandes suivantes :
library(heatmaply)
gradient_col <- ggplot2::scale_fill_gradient2(
low = "blue", high = "red", midpoint = 0, limits = c(-8, 8))Vous pouvez trouver ci-joint deux sites donnant des exemples d’utilisation et de l’aide sur la librairie heatmaply :
Dans un premier temps, nous allons sélectionner le chromosome que l’on souhaite étudier.
Prenons ici le chromosome numéro 1.
# on selectionne le chromosome souhaité dans notre dataframe
chr1 <- subset(gene.exp, gene.exp$chr==1)
# on selectionne les colonnes qui nous interessent
mydata_1 <- chr1[, 3:18]
# nom des lignes
rownames(mydata_1) <- mydata_1[, 1]
# on supprime la première colonne qui ne nous interesse plus
mydata_1 <- mydata_1[, -1] Création de la heatmap à l’aide de heatmaply :
heatmaply(mydata_1, scale_fill_gradient_fun = gradient_col,
Colv=NA, Rowv=NA, scale='none', limits = c(-8, 8),
xlab = "Individus",ylab = "Gènes",
main = "Expression des gènes du chromosome 1")La heatmap ci-dessus nous donne visuellement une idée de l’expression de chaque gène du chromosome 1. On observe que dans la majorité des cas le gène “CLCA2” est sur-exprimé (les cellules apparaissent très rouges), et les gènes “PDZK1” “DLANI1” sont sous-exprimés (les cellules apparaissent plutôt bleutées).
Vous pouvez choisir d’afficher les corrélations avec la fonction heatmaply_cor() ou les valeurs manquantes avec la fonction heatmaply_na().
A vous de jouer
En vous basant sur l’exemple ci-dessus, créez une heatmap représentant l’expression des gènes du chromosome 17.
Voici une idée du résultat que vous devez obtenir :
Afficher la Solution
chr17 <- subset(gene.exp, gene.exp$chr == 17 )
mydata_17 <- chr17[,3:18]
rownames(mydata_17) <- mydata_17[,1]
mydata_17 <- mydata_17[,-1]
heatmaply(mydata_17, scale_fill_gradient_fun = gradient_col,
Colv=NA, Rowv=NA, scale='none', limits = c(-7, 8),
xlab = "Individus",ylab = "Gènes",
main = "Expression des gènes du chromosome 17")Lexique
hg18 : La représentation du génome humain a connu plusieurs versions avant d’aboutir à la représentation la plus optimale. La version 18 s’agit de la version avant dernière.
Her2 : Une protéine naturellement présente dans l’organisme. Il s’agit d’un récepteur transmembranaire impliqué dans la régulation de la prolifération cellulaire.
LumA : Le cancer du sein Luminal A est l’un des sous-types luminaux et est généralement associé à des caractéristiques moins agressives par rapport à Luminal B.
LumB : Associé à un grade plus élevé, des taux de prolifération accrus, et un pronostic global plus défavorable.
Basal : Un sous-type du cancer du sein négatif pour les récepteurs d’oestrogène (ER), les récepteurs de progestérone (PR) et le récepteur 2 du facteur de croissance épidermique humain (HER2). On le désigne souvent comme un cancer du sein triple négatif (TNBC).
FDR (First Division Restitution) : Réfère à l’évènement où l’une des cellules filles produites lors de la première division méiotique conserve les deux chromatides d’un chromosome, sans subir la séparation normale en deux cellules distinctes. Cela aboutit à un gamète avec un ensemble complet de chromosomes, plutôt que la moitié attendue.
Bonferroni : Une correction statistique.